#include "delay.h"
#include "stm32f4xx.h"

static uint32_t fac_us = 0;  // 每微秒所需的计数数值

/**
  * @brief  初始化 SysTick，用于后续微秒/毫秒延时
  * @note   SysTick 默认使用 HCLK 时钟（系统主频），STM32F407 默认为 168MHz
  */
void Delay_Init(void)
{
    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);  // 使用 HCLK 作为时钟源（168MHz）
    fac_us = SystemCoreClock / 1000000;               // 计算每微秒多少个 SysTick 时钟周期
}

/**
  * @brief  微秒级延时函数
  * @param  us 延时微秒数
  */
void Delay_us(uint32_t us)
{
    uint32_t temp;

    SysTick->LOAD = us * fac_us;                      // 设置计数器初值
    SysTick->VAL = 0x00;                              // 清空当前计数器值
    SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;        // 启动 SysTick

    do {
        temp = SysTick->CTRL;
    } while ((temp & SysTick_CTRL_ENABLE_Msk) && !(temp & SysTick_CTRL_COUNTFLAG_Msk)); // 等待超时

    SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;        // 关闭 SysTick
    SysTick->VAL = 0x00;                               // 清空当前值
}

/**
  * @brief  毫秒级延时函数（阻塞式）
  * @param  ms 延时毫秒数
  */
void Delay_ms(uint32_t ms)
{
    while (ms--)
    {
        Delay_us(1000);  // 每次延时 1ms
    }
}
